home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Programming Languages Suite
/
ProgramD2.iso
/
Borland
/
Borland C++ V5.02
/
DB.PAK
/
DBPPG.CPP
< prev
next >
Wrap
C/C++ Source or Header
|
1997-05-06
|
12KB
|
469 lines
// dbppg.cpp : Implementation of the CDbPropPage property page class.
//
// This is a part of the Microsoft Foundation Classes C++ library.
// Copyright (C) 1992-1995 Microsoft Corporation
// All rights reserved.
//
// This source code is only intended as a supplement to the
// Microsoft Foundation Classes Reference and related
// electronic documentation provided with the library.
// See these sources for detailed information regarding the
// Microsoft Foundation Classes product.
#include "stdafx.h"
#include "db.h"
#include "dbppg.h"
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
IMPLEMENT_DYNCREATE(CDbPropPage, COlePropertyPage)
#define STR_LEN 128+1
/////////////////////////////////////////////////////////////////////////////
// Message map
BEGIN_MESSAGE_MAP(CDbPropPage, COlePropertyPage)
//{{AFX_MSG_MAP(CDbPropPage)
ON_CBN_SELCHANGE(IDC_DATASOURCE, OnSelchangeDatasource)
ON_CBN_SELCHANGE(IDC_COLUMNS, OnSelchangeColumns)
ON_CBN_SELCHANGE(IDC_TABLES, OnSelchangeTables)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// Initialize class factory and guid
IMPLEMENT_OLECREATE_EX(CDbPropPage, "DB.DbPropPage.1",
0xeff01749, 0x7825, 0x101b, 0x83, 0x75, 0x0, 0xaa, 0x0, 0x37, 0x3f, 0xb9)
/////////////////////////////////////////////////////////////////////////////
// CDbPropPage::CDbPropPageFactory::UpdateRegistry -
// Adds or removes system registry entries for CDbPropPage
BOOL CDbPropPage::CDbPropPageFactory::UpdateRegistry(BOOL bRegister)
{
if (bRegister)
return AfxOleRegisterPropertyPageClass(AfxGetInstanceHandle(),
m_clsid, IDS_DB_PPG);
else
return AfxOleUnregisterClass(m_clsid, NULL);
}
/////////////////////////////////////////////////////////////////////////////
// CDbPropPage::CDbPropPage - Constructor
CDbPropPage::CDbPropPage() :
COlePropertyPage(IDD, IDS_DB_PPG_CAPTION)
{
//{{AFX_DATA_INIT(CDbPropPage)
m_dataSource = _T("");
m_columnName = _T("");
m_tableName = _T("");
//}}AFX_DATA_INIT
}
/////////////////////////////////////////////////////////////////////////////
// CDbPropPage::DoDataExchange - Moves data between page and properties
void CDbPropPage::DoDataExchange(CDataExchange* pDX)
{
//{{AFX_DATA_MAP(CDbPropPage)
DDP_CBString(pDX, IDC_DATASOURCE, m_dataSource, _T("DataSource") );
DDX_CBString(pDX, IDC_DATASOURCE, m_dataSource);
DDP_CBString(pDX, IDC_TABLES, m_tableName, _T("TableName") );
DDX_CBString(pDX, IDC_TABLES, m_tableName);
DDP_CBString(pDX, IDC_COLUMNS, m_columnName, _T("ColumnName") );
DDX_CBString(pDX, IDC_COLUMNS, m_columnName);
//}}AFX_DATA_MAP
DDP_PostProcessing(pDX);
}
/////////////////////////////////////////////////////////////////////////////
// CDbPropPage message handlers
BOOL CDbPropPage::OnInitDialog()
{
COlePropertyPage::OnInitDialog();
UCHAR szSourceName[SQL_MAX_DSN_LENGTH+1];
UCHAR szDescription[255];
SWORD swDLength;
SWORD swSLength;
RETCODE rCode;
HENV hEnv;
CComboBox *pDSNCombo = (CComboBox *) GetDlgItem(IDC_DATASOURCE);
CComboBox *pTablesCombo = (CComboBox *) GetDlgItem(IDC_TABLES);
CComboBox *pColumnsCombo = (CComboBox *) GetDlgItem(IDC_COLUMNS);
pDSNCombo->EnableWindow(FALSE);
pTablesCombo->EnableWindow(FALSE);
pColumnsCombo->EnableWindow(FALSE);
if (SQLAllocEnv(&hEnv) != SQL_SUCCESS)
{
MessageBox("Couldn't allocate HENV!");
return FALSE;
}
rCode = SQLDataSources(hEnv, SQL_FETCH_FIRST, szSourceName,
SQL_MAX_DSN_LENGTH, &swSLength, szDescription,
sizeof(szDescription), &swDLength);
if (rCode != SQL_ERROR && rCode != SQL_NO_DATA_FOUND)
{
do {
pDSNCombo->AddString((char *) szSourceName);
rCode = SQLDataSources(hEnv, SQL_FETCH_NEXT, szSourceName,
SQL_MAX_DSN_LENGTH, &swSLength, szDescription, sizeof(szDescription), &swDLength);
}
while (rCode != SQL_ERROR && rCode != SQL_NO_DATA_FOUND);
}
SQLFreeEnv(hEnv);
if (pDSNCombo->GetCount() > 0)
{
pDSNCombo->EnableWindow();
if (!m_dataSource.IsEmpty())
if (pDSNCombo->SelectString(-1, m_dataSource) == CB_ERR)
m_dataSource.Empty();
else
OnSelchangeDatasource();
}
return FALSE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void ODBCErrorBox(CWnd* pParent, HENV hEnv, HDBC hDBC)
{
UCHAR szState[SQL_MAX_MESSAGE_LENGTH];
UCHAR szError[SQL_MAX_MESSAGE_LENGTH];
SDWORD dwError;
SWORD wErrorLen;
CString strMessage;
SQLError(hEnv, hDBC, SQL_NULL_HSTMT, szState, &dwError, szError,
SQL_MAX_MESSAGE_LENGTH-1, &wErrorLen);
strMessage = (LPSTR) szState;
strMessage += ": ";
strMessage += (LPSTR) szError;
if (pParent == NULL)
::MessageBox(NULL, (LPSTR) szError, "ODBC Error!", MB_OK);
else
pParent->MessageBox((LPSTR) szError, "ODBC Error!");
return;
}
static int GetDriverLevel(HDBC hdbc)
{
WORD wLevel;
SQLGetInfo(hdbc,
SQL_ODBC_API_CONFORMANCE,
(PTR)&wLevel,
sizeof(wLevel),
NULL);
return (int) wLevel;
}
void CDbPropPage::OnSelchangeDatasource()
{
HENV henv;
HDBC hdbc;
HSTMT hstmt;
RETCODE retcode;
CComboBox *psColumns = (CComboBox *) GetDlgItem(IDC_COLUMNS);
CComboBox *psBox = (CComboBox *) GetDlgItem(IDC_DATASOURCE);
CComboBox *psTables = (CComboBox *) GetDlgItem(IDC_TABLES);
int nSelected;
char szOwner[STR_LEN];
char szTableName[STR_LEN];
UCHAR szSource[STR_LEN];
UCHAR szBrowseResult[STR_LEN];
SDWORD cbOwner, cbName;
nSelected = psBox->GetCurSel();
if (nSelected == CB_ERR)
return;
psBox->GetLBText(nSelected, m_dataSource);
strcpy((LPSTR) szSource, m_dataSource);
retcode = SQLAllocEnv(&henv); /* Environment handle */
if (retcode == SQL_SUCCESS)
{
retcode = SQLAllocConnect(henv, &hdbc); /* Connection handle */
if (retcode == SQL_SUCCESS)
{
BOOL bNeedID = FALSE;
if (GetDriverLevel(hdbc) == 2)
{
SWORD cbBrowse;
UCHAR szSourceInfo[256];
cbBrowse = STR_LEN;
strcpy((LPSTR) szSourceInfo, "DSN=");
strcat((LPSTR) szSourceInfo, m_dataSource);
SQLBrowseConnect(hdbc, szSourceInfo, SQL_NTS,
szBrowseResult, STR_LEN, &cbBrowse);
MessageBox((LPSTR) szBrowseResult);
if (strstr((LPCSTR) szBrowseResult, "PWD") != NULL)
{
bNeedID = TRUE;
}
}
GetDlgItem(ID_USERNAME)->EnableWindow(bNeedID);
GetDlgItem(ID_PASSWORD)->EnableWindow(bNeedID);
// Set login timeout to 15 seconds
SQLSetConnectOption(hdbc, SQL_LOGIN_TIMEOUT, 15);
// Connect to data source
retcode = SQLConnect(hdbc, szSource, SQL_NTS,
NULL, SQL_NTS, NULL, SQL_NTS);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
{
// try to get a list of tables
retcode = SQLAllocStmt(hdbc, &hstmt); /* Statement handle */
if (retcode == SQL_SUCCESS)
{
retcode = SQLTables(hstmt,
NULL, 0, // all qualifiers
NULL, 0, // all owners
NULL, 0, // all tables
NULL, 0); // all types
if (retcode == SQL_SUCCESS)
{
SQLBindCol(hstmt, 2, SQL_C_CHAR, szOwner, STR_LEN, &cbOwner);
SQLBindCol(hstmt, 3, SQL_C_CHAR, szTableName, STR_LEN, &cbName);
psTables->ResetContent();
psColumns->ResetContent();
psColumns->EnableWindow(FALSE);
BOOL bAddedOne = FALSE;
while (TRUE)
{
retcode = SQLFetch(hstmt);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
{
CString strAdd;
if (lstrlen(szOwner) != 0)
{
strAdd = szOwner;
strAdd += ".";
}
strAdd += szTableName;
psTables->AddString(strAdd);
bAddedOne = TRUE;
}
else
{
break;
}
}
psTables->EnableWindow(bAddedOne);
}
else
{
ODBCErrorBox(this, henv, hdbc);
}
SQLFreeStmt(hstmt, SQL_DROP);
}
SQLDisconnect(hdbc);
}
else
{
ODBCErrorBox(this, henv, hdbc);
}
SQLFreeConnect(hdbc);
}
SQLFreeEnv(henv);
}
return;
}
void CDbPropPage::OnSelchangeColumns()
{
return;
}
void CDbPropPage::OnSelchangeTables()
{
CComboBox *psTables = (CComboBox *) GetDlgItem(IDC_TABLES);
CComboBox *psColumns = (CComboBox *) GetDlgItem(IDC_COLUMNS);
int nSelected;
HENV henv;
HDBC hdbc;
HSTMT hstmt;
RETCODE retcode;
BOOL bAddedOne;
UCHAR szSource[256];
UCHAR szSelectedTable[256];
UCHAR szSelectedOwner[256];
char szColumnName[STR_LEN];
SDWORD cbColumnName;
LPSTR pstrTrim;
BOOL bHasOwner;
nSelected = psTables->GetCurSel();
if (nSelected == CB_ERR)
return;
psTables->GetLBText(nSelected, (char *) szSelectedTable);
m_tableName = (char*) szSelectedTable;
pstrTrim = strchr((LPSTR) szSelectedTable, '.');
if (pstrTrim != NULL)
{
*pstrTrim = '\0';
strcpy((LPSTR) szSelectedOwner, (LPSTR) szSelectedTable);
strcpy((LPSTR) szSelectedTable, pstrTrim+1);
bHasOwner = TRUE;
}
else
{
bHasOwner = FALSE;
}
strcpy((LPSTR) szSource, m_dataSource);
retcode = SQLAllocEnv(&henv); // Environment handle
if (retcode == SQL_SUCCESS)
{
retcode = SQLAllocConnect(henv, &hdbc); // Connection handle
if (retcode == SQL_SUCCESS)
{
// Set login timeout to 15 seconds
SQLSetConnectOption(hdbc, SQL_LOGIN_TIMEOUT, 15);
// Connect to data source
retcode = SQLConnect(hdbc, szSource, SQL_NTS,
NULL, SQL_NTS, NULL, SQL_NTS);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
{
// try to get a list of columns for the table
retcode = SQLAllocStmt(hdbc, &hstmt); // Statement handle
if (retcode == SQL_SUCCESS)
{
if (bHasOwner == TRUE)
{
retcode = SQLColumns(hstmt,
NULL, 0, // no table qualifier
szSelectedOwner, SQL_NTS, // specified owner
szSelectedTable, SQL_NTS, // selected table
NULL, 0 // no pattern
);
}
else
{
retcode = SQLColumns(hstmt,
NULL, 0, // no table qualifier
NULL, 0, // no table owner
szSelectedTable, SQL_NTS, // selected table
NULL, 0 // no pattern
);
}
if (retcode == SQL_SUCCESS)
{
SQLBindCol(hstmt, 4, SQL_C_CHAR, szColumnName, STR_LEN, &cbColumnName);
psColumns->ResetContent();
bAddedOne = FALSE;
while (TRUE)
{
retcode = SQLFetch(hstmt);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
{
psColumns->AddString(szColumnName);
bAddedOne = TRUE;
}
else
{
break;
}
}
psColumns->EnableWindow(bAddedOne);
}
else
{
ODBCErrorBox(this, henv, hdbc);
}
SQLFreeStmt(hstmt, SQL_DROP);
}
else
{
ODBCErrorBox(this, henv, hdbc);
}
SQLDisconnect(hdbc);
}
else
{
ODBCErrorBox(this, henv, hdbc);
}
SQLFreeConnect(hdbc);
}
SQLFreeEnv(henv);
}
if (psTables->GetCurSel() != CB_ERR)
{
psColumns->EnableWindow(TRUE);
}
else
{
psColumns->EnableWindow(TRUE);
}
}